# 参数缺省值，带有默认值的缺省参数应该放在方法列表末尾
def print_info(name, title="", gender=True):
    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("【%s】%s 是 %s" % (title, name, gender_text))


print_info("jay", "总监", True)
# 调用有多个缺省值的函数，需要指明传入哪个值
print_info("小明", title="经理")
print_info("小红", gender=False)


# 多值参数，参数个数不确定
# 多值传递一般使用元组或字典而且有规范的命名
# *args：表示参数传递的是一个元素
# **kwagrs：表示参数传递的是一个字典
def sum1(nums):
    count = 0
    for n in nums:
        count += n
    return count


def sum2(*nums):
    count = 0
    for n in nums:
        count += n
    return count


# sum1方法参数应该为一个元组，如果使用以下方式传递参数是错误的因为方法只接受一个参数
# sum1(1, 2, 3)
# 应该添加一对小括号表示这是一个元组
print(sum1((1, 2, 3)))
# 有了多值传递的sum2参数为*nums表示参数为一个元组省去一对小括号
print(sum2(1, 2, 3))


# 元组、字典的拆包
# 当需要把元组/字典当做参数直接传入方法时就需要拆包
def test(*args, **kwargs):
    print(args)
    print(kwargs)


gl_nums = (1, 2, 3)
gl_stu = {"name": "slx", "age": 12}
# 以下传值方式都会当做元组传入test函数
# test(gl_nums, gl_stu)
# 以下方式可以正确的传入元组类型多值参数和字典类型的多值参数
test(1, 2, 3, name="slx", age=12)
# 但是我们需要将变量直接传给多值参数的函数，就需要使用拆包的语法
# 在变量前添加*表示传元组，变量前添加**表示传字典
test(*gl_nums, **gl_stu)
